/*
 * File: ChemicalsMonitoring.cpp
 * Author: Magica
 * Date: 2014.09.05
 ****************************************/
#include <bits/stdc++.h>
using namespace std;
#define Multicase for (int TestCase = 1, TestCaseSum = xint(); TestCase <= TestCaseSum; ++TestCase)
#define __cin__ { cin.sync_with_stdio(0); cin.tie(0); }
#define inject(x) { cerr << "Function: " << __FUNCTION__ << ", Line: " << __LINE__ << ", " << #x << ": " << (x) << endl; }
#define mp make_pair
#define pb push_back
#define init(range, val) memset(range, val, sizeof(range))
typedef pair<int, int> pii;
typedef long long ll;
char buf;
inline char xchar() { while (buf = getchar(), isspace(buf)); return buf; }
inline int xint() { while (buf = getchar(), buf < '0' || buf > '9'); int x = buf - '0'; for (; buf = getchar(), buf >= '0' && buf <= '9'; x = x * 10 + buf - '0'); return x; }
inline ll xll() { while (buf = getchar(), buf < '0' || buf > '9'); ll x = buf - '0'; for (; buf = getchar(), buf >= '0' && buf <= '9'; x = x * 10 + buf - '0'); return x; }
inline string xstring() { while (buf = getchar(), buf == ' ' || buf == '\n'); string x = ""; for (x += buf; buf = getchar(), buf != ' ' && buf != '\n' && buf != '\r'; x += buf); return x; }
inline string xline() { while (buf = getchar(), buf == ' ' || buf == '\n'); string x = ""; for (x += buf; buf = getchar(), buf != '\n' && buf != '\r'; x += buf); return x; }
struct RangeStruct {
    int l, r, len, p, id;
} Range[5005], Range2[5005];
int f[5005], g[10005];
vector<int> All;
map<int, int> S;
inline bool LengthCompare(const RangeStruct &A, const RangeStruct &B)
{
    return A.len < B.len;
}
inline bool PriorityCompare(const RangeStruct &A, const RangeStruct &B)
{
    return A.p < B.p;
}
inline bool RightCompare(const RangeStruct &A, const RangeStruct &B)
{
    return A.r < B.r;
}
int main()
{
    int i, j, n, cur;
    All.reserve(10005);
    while (scanf("%d", &n) != EOF) {
        init(f, 0);
        All.clear();
        S.clear();
        for (i = 1; i <= n; ++i) {
            Range[i].l = xint();
            Range[i].len = xint();
            Range[i].r = Range[i].l + Range[i].len - 1;
            Range[i].p = xint();
            All.pb(Range[i].l);
            All.pb(Range[i].r);
        }
        ++n; Range[n].l = 1; Range[n].len = Range[n].r = 2000000001; Range[n].p = 0;
        All.pb(1); All.pb(2000000001);
        sort(All.begin(), All.end());
        All.erase(unique(All.begin(), All.end()), All.end());
        for (i = 0; i < (int)All.size(); ++i)
            S[All[i]] = i + 1;
        for (i = 1; i <= n; ++i) {
            Range[i].l = S[Range[i].l];
            Range[i].r = S[Range[i].r];
            Range[i].len = Range[i].r - Range[i].l;
        }
        sort(Range + 1, Range + n + 1, LengthCompare);
        for (i = 1; i <= n; ++i)
            Range[i].id = i;
        memcpy(Range2, Range, sizeof(Range));
        sort(Range2 + 1, Range2 + n + 1, RightCompare);
        for (i = 1; i <= n; ++i) {
            init(g, 0);
            cur = 1;
            for (j = Range[i].l; j <= Range[i].r; ++j) {
                g[j] = g[j - 1];
                for (; cur <= n && Range2[cur].r <= j; ++cur)
                    if (Range2[cur].l >= Range[i].l)
                        g[j] = max(g[j], g[Range2[cur].l - 1] + f[Range2[cur].id]);
            }
            f[i] = g[Range[i].r] + Range[i].p;
        }
        printf("%d\n", f[n]);
    }
    return 0;
}
